
/*
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/

#include <iostream>
#include "GrupoFiguras.h"
#include "DibujoSVG.h"
#include <vector>

using namespace std;


GrupoFiguras::GrupoFiguras( const vector<Figura2D*> figuras, string descr )
{
	/*
	for( int i = 0; i < (int) figuras.size(); i++)
	{
		figs.push_back(figuras[i]);
	}*/
	figs = figuras;

	descripcion = descr;
}

GrupoFiguras::GrupoFiguras( const GrupoFiguras &grupo)
{
	if( this != &grupo )
	{
		/*
		for( int i = 0; i < (int) grupo.figs.size(); i++)

		{
			figs.push_back(grupo.figs[i]);
			figs[i]->setAgrupada(true);
		}*/
		figs = grupo.figs;
		for(int i = 0; i < (int) figs.size(); i++)
		{
			figs[i]->setAgrupada(true);
		}
		descripcion = grupo.descripcion;
	}
}

GrupoFiguras::~GrupoFiguras()
{
	if(!figs.empty())
	{
		for( int i = 0; i < (int) figs.size(); i++)
		{
			figs[i]->setAgrupada(false);
			figs[i] = NULL;
		}
	}
}

GrupoFiguras&
GrupoFiguras::operator =( const GrupoFiguras &g)
{
	if( this != &g)
	{
		descripcion = g.descripcion;
		figs = g.figs;
	}

	return *this;
}

void 
GrupoFiguras::pintar(ostream& os) const
{

	int i=0;
	if(!figs.empty())
	{
		os << "<g>" << endl;
		os << "<desc>" << descripcion << "</desc>" << endl << endl;

		for(; i < (int) figs.size(); i++)
		{
			figs[i]->pintar(os);
		}
		os << "</g>" << endl;
	}
	
}
bool
GrupoFiguras::puedoPintarme() const
{
	bool pintar=false;

	if(!figs.empty())
	{
		for( int i = 0; i < (int) figs.size(); i++)
		{
			if(figs[i]->esAgrupada())
			{
				pintar=true;
			}
		}		
	}
	
	return pintar;
	
}
void 
GrupoFiguras::leeEntrada(istream& is)
{
	string texto;

	is>>texto;
	//throw ExcepcionValorNoValido(1, texto); esto que hacia aqui? XD
}

const Figura2D&
GrupoFiguras::getFigura(int i) const
{
	Figura2D* figura = NULL;

	//if(!figs[i]->esAgrupada())
	if ( i-1 < (int)figs.size() )
	{
		figura = figs[i-1];
	}
	else
	{
		throw ExcepcionValorNoValido(i, "Figura no existe en el grupo");
	}
	return *figura;
}
Coordenada 
GrupoFiguras::mover(const Coordenada& nuevoOrigen)
{
	Coordenada vieja;
	Coordenada desplazamiento;
	Coordenada aux;

		if( nuevoOrigen.getX() <=DibujoSVG::MAX_VALOR && nuevoOrigen.getX() >=DibujoSVG::MIN_VALOR && nuevoOrigen.getY() <=DibujoSVG::MAX_VALOR && nuevoOrigen.getY() >=DibujoSVG::MIN_VALOR)
		{
			vieja=figs[0]->mover(nuevoOrigen);
			desplazamiento=nuevoOrigen-vieja;

			aux = desplazamiento + vieja;
			if(aux.getX() > DibujoSVG::MAX_VALOR || aux.getX() < DibujoSVG::MIN_VALOR || aux.getY() > DibujoSVG::MAX_VALOR || aux.getY() < DibujoSVG::MIN_VALOR){
					throw ExcepcionCoordenadaErronea( aux.getX(), aux.getY() );
			}		
		}
		else throw ExcepcionCoordenadaErronea(nuevoOrigen.getX(), nuevoOrigen.getY());

		if(!figs.empty())
		{
			for( int i = 1; i < (int) figs.size(); i++) // Cambiado para que empieze por la segunda figura, i = 1.
			{
					Coordenada coor;
					coor = figs[i]->getOrigen();
					coor = coor + desplazamiento;

					if(coor.getX() <=DibujoSVG::MAX_VALOR && coor.getX() >=DibujoSVG::MIN_VALOR && coor.getY() <=DibujoSVG::MAX_VALOR && coor.getY() >=DibujoSVG::MIN_VALOR){
						figs[i]->mover(coor);
					}
					else
					{
						throw ExcepcionCoordenadaErronea( coor.getX(), coor.getY() );
					}
			}
		}

	return vieja;
}
Coordenada
GrupoFiguras::getOrigen() const
{
	if(figs.size() > 0)
	{
		return figs[0]->getOrigen();
	}
	else
	{
		throw ExcepcionCoordenadaErronea(-13,-37);//codigo secreto XD
	}
}

void
GrupoFiguras::escalar(float porcentaje)
{
	if(!figs.empty())
	{
		for( int i = 0; i < (int) figs.size(); i++)
		{
			figs[i]->escalar(porcentaje);
		}
	}
}

GrupoFiguras*
GrupoFiguras::clonar() const
{
	vector<Figura2D*>aux;

	for(int i = 0; i < (int) figs.size(); i++)
	{

		aux.push_back(dynamic_cast<Figura2D*>(figs[i]->clonar()));
	}

	GrupoFiguras* clon = new GrupoFiguras(aux,descripcion);
	//GrupoFiguras* clon = new GrupoFiguras(*this);
	return clon;
}
GrupoFiguras*
GrupoFiguras::duplicar(const Coordenada &nuevoOrigen)
{
	GrupoFiguras* auxiliar = this->clonar();

	auxiliar->mover(nuevoOrigen);
	/*if(!figs.empty())
	{
		for( int i = 0; i < (int) figs.size(); i++)
		{
			try{

				Figura2D* figura = figs[i]->duplicar(nuevoOrigen);
				Coordenada coor = figura->getOrigen();
				if(coor.getX() <=DibujoSVG::MAX_VALOR && coor.getX() >=DibujoSVG::MIN_VALOR && coor.getY() <=DibujoSVG::MAX_VALOR && coor.getY() >=DibujoSVG::MIN_VALOR)
				{
					auxiliar->figs[i] = figura;
				}
				else
				{
					throw ExcepcionCoordenadaErronea( coor.getX(), coor.getY() );
				}	
			}
			catch( ExcepcionCoordenadaErronea &c)
			{
				c.what();
			}
		}
			
	}*/
	return auxiliar;
}

int
GrupoFiguras::getNumFiguras()
{
	int aux = 0;

	aux = figs.size();

	return aux;
}
